Linux 驱动开发问答合集
由 9 篇星球问答重组而成,覆盖驱动编写、设备树与 probe 排查、二进制接口、调试手段与构建环境五大主题。原帖全部保留,见文末来源清单。
一、驱动编写
旋钮(编码器)这种外设要自己写驱动吗?
分情况:普通按键功能,Linux 内核有默认驱动可以直接复用;识别正反+按下的无极编码器旋钮,内核没有现成的,要自己写。前提是旋钮外设支持中断,或者在驱动中轮询(poll)外设状态。
— 老师,在Linux里面,如果我想实现一个旋钮功能,类似于那种洗衣机上的旋钮(Jack)
二、设备树与 probe 排查
SDK 里已经有 xxx driver.c,去哪找对应的设备树文件?
以瑞芯微 SDK 的 imx415 摄像头驱动为例:从驱动的 compatible 字符串出发,在 SDK 的设备树目录(arch/arm64/boot/dts/rockchip 一类)全局搜索该 compatible,即可定位对应的 dts/dtsi 节点(答帖附图演示了完整查找路径)。
— 老师,我有个疑问,我现在想着用imx415去搞点音视频的东西(Jack)
compatible 和设备树明明匹配,probe 函数却一直不跑?
真实踩坑案例:该模块在设备树里配置了 pinctrl 的 default 状态,但 pinctrl 语法写错了,really_probe 没跑完就提前返回,于是驱动的 probe 根本没被执行。结论:设备树 pinctrl 写错是"驱动看起来没加载"的隐性原因之一,compatible 匹配 ≠ probe 一定执行。
— 最近遇到的问题,Linux 驱动的 compatible 和设备树是匹配(Jason)
三、二进制接口
ABI 和 AAPCS 是什么?为什么 C 和 C++ 在二进制层面不完全兼容?
ABI(应用二进制接口)是总称,定义软件组件在特定执行环境中如何交互,包括数据类型、对象布局、程序执行、系统调用接口等规定;AAPCS 是 ABI 的一个具体实现,专门针对 Arm 架构的过程调用标准,详细规定过程调用时的寄存器使用、参数传递、返回值处理。C/C++ 遵循的具体二进制约定不同,所以二进制层面不完全兼容。
— ABI和AAPCS是什么?为什么C和C++在二进制层面不完全兼容(Jack)
四、调试手段
不接外部调试器怎么调试 Linux?
self-host debug 两条路:应用层用 gdb + gdbserver,走 ETH/UART 调试 Linux 应用程序;内核用 gdb + kgdb,走 UART 调试 Linux 内核。
— Linux调试不借助外部调试器(Jack)
软件断点和硬件断点分别怎么触发?
原帖口径:硬件断点利用 DWT 单元,检测到 PC 到达某地址就暂停 CPU;软件断点在代码中插入中断(断点)指令,CPU 读到即停。——注意:该帖把两者定义写反了,通常语义应为"软件断点=插入断点指令(数量不限)、硬件断点=DWT 比较器(数量有限)",参考时以原书章节(离线断点二/四)为准。
— 老师,了解到分为软件断点与硬件断点,软件可以有无数个(Jack)
五、岗位与构建环境
Linux BSP 工程师就是干 Bring up 的吗?
都干。真正有风险的是 first landing(首次点亮)项目;迭代项目开机比较简单,一般由稳定性团队出一名"开机手"串起各个模块,谁卡住谁加班。
— Linux当中,bsp工程师是不是就是干Bring up(Jack)
安卓系统怎么编译?
1)编译 Android 在根目录进行,传统流程是 source build/xxx.sh → lunch xxxx → make;2)大部分厂商会封装编译脚本(python 或 shell),在其中指定编译 img 和输出目录;3)只需要编译 kernel 时,可进 kernel 目录直接 make(不同平台可能有额外设定)。
— 安卓的系统编译 1.编译An(Jack)
makefile 和 cmake 是什么关系?
一句话类比:makefile 之于 cmake,就好比汇编之于 C 语言——cmake 是更高级的描述,最终生成 makefile 去执行。
— 可以简单理解为makefile(Jack)
来源笔记
- 老师,在Linux里面,如果我想实现一个旋钮功能,类似于那种洗衣机上的旋钮(Jack)
- 老师,我有个疑问,我现在想着用imx415去搞点音视频的东西(Jack)
- 最近遇到的问题,Linux 驱动的 compatible 和设备树是匹配(Jason)
- ABI和AAPCS是什么?为什么C和C++在二进制层面不完全兼容(Jack)
- 老师,了解到分为软件断点与硬件断点,软件可以有无数个(Jack)
- Linux调试不借助外部调试器(Jack)
- Linux当中,bsp工程师是不是就是干Bring up(Jack)
- 安卓的系统编译 1.编译An(Jack)
- 可以简单理解为makefile(Jack)